package dominio.modelo;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.Table;

import org.hibernate.Criteria;
import org.hibernate.Session;
import org.hibernate.annotations.Cascade;
import org.hibernate.annotations.CascadeType;
import org.hibernate.criterion.ProjectionList;
import org.hibernate.criterion.Projections;

import util.HibernateUtil;

@Entity
@Table(name="FILME")
public class Filme {
 
	@Id
	@GeneratedValue(strategy=GenerationType.AUTO)
	private int id;
	
	@Column(name="TITULO")
	private String titulo;
	 
	@Column(name="SINOPSE", length=1000)
	private String sinopse;
	 
	@Column(name="RANKING")
	private int ranking;
	
	@Column(name="DATA")
	private Date data;
	
	@Column(name="IMG", length=1000)
	private String imagem;
	
	@OneToMany
	@JoinColumn(name="IDFILME")
	@Cascade(value={CascadeType.DELETE_ORPHAN, CascadeType.ALL})
	private List<Comentario> listComentario;

	@ManyToOne
	@JoinColumn(name="IDGENERO")
	@Cascade(value={CascadeType.ALL})
	private Genero genero;
	 
	public Filme() {
		listComentario = new ArrayList<Comentario>();
	}
	
	public String getTitulo() {
		return titulo;
	}

	public void setTitulo(String titulo) {
		this.titulo = titulo;
	}

	public String getSinopse() {
		return sinopse;
	}
	
	public String getSinopseReduzida() {
		if (sinopse.length() > 250) {
			return sinopse.substring(0, 250) + " ...";
		}
		
		return sinopse;
	}

	public void setSinopse(String sinopse) {
		this.sinopse = sinopse;
	}

	public int getRanking() {
		return ranking;
	}
	
	public int carregarImagemRanking() {
		Session session = HibernateUtil.getSession();
		Criteria criteria = session.createCriteria(Filme.class);
		ProjectionList projection = Projections.projectionList();
		projection.add(Projections.max("ranking"));
		criteria.setProjection(projection);
		List<Integer> listMaiorRanking = criteria.list();
		session.close();
		
		
		int maiorRanking = listMaiorRanking.get(0);
		int resultado = getRanking() * 100 / maiorRanking;

		if (resultado <= 20) {
			return 1;
		}
		
		if (resultado > 20 && resultado <= 40) {
			return 2;
		}
		
		if (resultado > 40 && resultado <= 60) {
			return 3;
		}
		
		if (resultado > 60 && resultado <= 80) {
			return 4;
		}
		
		return 5;
	}

	public void setRanking(int ranking) {
		this.ranking = ranking;
	}
	
	public void addToComentario(Comentario comentario) {
		this.listComentario.add(comentario);
	}
	
	public void removeToComentario(Comentario comentario) {
		this.listComentario.remove(comentario);
	}

	public Genero getGenero() {
		return genero;
	}

	public void setGenero(Genero genero) {
		this.genero = genero;
	}

	public Date getData() {
		return data;
	}

	public void setData(Date data) {
		this.data = data;
	}
	
	public List<Comentario> getListComentario() {
		return listComentario;
	}

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public String getImagem() {
		return imagem;
	}

	public void setImagem(String imagem) {
		this.imagem = imagem;
	}
	
}
 
